package tpcorba.exoservdp;

import java.util.concurrent.ConcurrentHashMap;

import tpcorba.exoservdp.servdp.CleAbsente;
import tpcorba.exoservdp.servdp.CleDejaPresente;
import tpcorba.exoservdp.servdp.CleNonValide;
import tpcorba.exoservdp.servdp.ServDPItfPOA;
import tpcorba.exoservdp.servdp.octetSetHolder;


/**
 * Applications reparties
 * TP - Exercice
 * ServDP
 * 
 * Classe des futurs objets serveurs
 * 
 * @author Toto
 * @version 1.0
 */
public class ServDPImpl extends ServDPItfPOA {

	private short nbreCouples;
	private ConcurrentHashMap<String, byte[]> liste;

	/**
	 * Constructeur par defaut
	 */
	public ServDPImpl() {
		liste = new ConcurrentHashMap<String, byte[]>();
		nbreCouples = 0;
	}
	
	/**
	 * Nombre de couples stockes
	 */
	public short nbreCouples()
	{
		return this.nbreCouples;
	}
	
	/**
	 * Modification du nombre de couples stockes
	 */
	public void nbreCouples(short newNbreCouples) {
		this.nbreCouples = newNbreCouples;		
	}

	/**
	 * Depot d'un couple (cle,valeur) a stocker
	 * @param cle (in) Valeur du String correspondant a la cle
	 * @param valeur (in) Tableau de bytes correspondant a la valeur
	 * @throws CleDejaPresente, CleNonValide
	 */
	public void deposer(String cle, byte[] valeur) throws CleDejaPresente, CleNonValide
	{
		if(cle==null || cle.equals("")) throw new CleNonValide();
		if(liste.putIfAbsent(cle,valeur) != null) {
			throw new CleDejaPresente();
		}
		this.nbreCouples++;
	}

	/**
	 * Retrait d'un couple (cle,valeur) stocke a partir de sa cle
	 * @param cle (in) Valeur du String correspondant a la cle
	 * @param valeur (out) Tableau de bytes correspondant a la valeur retiree
	 * @throws CleAbsente, CleNonValide
	 */
	public void retirer(String cle, octetSetHolder valeur) throws CleAbsente, CleNonValide
	{
		if(cle==null || cle.equals("")) throw new CleNonValide();
		if(liste.containsKey(cle) == false) {
			throw new CleAbsente();
		}
		valeur.value = liste.remove(cle);
		nbreCouples--;
	}

	/**
	 * Consultation d'un couple (cle,valeur) stocke a partir de sa cle
	 * @param cle (in) Valeur du String correspondant a la cle
	 * @param valeur (out) Tableau de bytes correspondant a la valeur
	 * @throws CleAbsente, CleNonValide
	 */
	public void lire(String cle, octetSetHolder valeur) throws CleAbsente, CleNonValide
	{
		if(cle==null || cle.equals("")) throw new CleNonValide();
		if(liste.containsKey(cle) == false) {
			throw new CleAbsente();
		}
		valeur.value = liste.get(cle);
	}

}
